﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace TiroAoAlvo_Cena03
{
    class Alvo
    {
        public static List<Alvo> Lista = new List<Alvo>();
        static int qtd_max = 6;  // quantidade de cartas que podem aparecer na tela 
        static int qtd_now = 0; //  quantidade de cartas que estão aparecendo na tela (em tempo de execução) 
        static Random random = new Random();
        public static SpriteFont arial;
        Texture2D textura;//imagem de cada carta
        Vector2 posicao;
        Vector2 tamanho;
        Rectangle destino;
        Rectangle origem; // fonte, origem
        int pontos;
        bool visivel;
        int proximoAparecer, tempoParaAparecer;
        int tempoAtual;
        GameWindow gw; // usdado para a colisão da carta com a tela

        public Alvo(Texture2D textura,
                             int pontos,
                             GameWindow gw)
        {
            this.textura = textura;

            this.tamanho = new Vector2(
                textura.Width, // pega os vetores da textura
                textura.Height);
            this.posicao = new Vector2(
                random.Next((int)(gw.ClientBounds.Width - tamanho.X)),
                random.Next(20,  (600 - (int)tamanho.Y))); // verifica se não está passando da tela
            this.destino = new Rectangle(
                (int)posicao.X,
                (int)posicao.Y, 
                (int)tamanho.X,
                (int)tamanho.Y);
            this.origem = new Rectangle( 
                0,
                0,
                (int)tamanho.X,
                (int)tamanho.Y);
            this.pontos = pontos;

            this.visivel = false;

            this.tempoParaAparecer = random.Next(60, 120);
            this.proximoAparecer = tempoParaAparecer;
            this.gw = gw;

            Alvo.Lista.Add(this); // Adiciona a carta criada na lista de alvos.
        }

        public void Update(GameTime gameTime, GameWindow gw,
            MouseState mouse_atual,
            MouseState mouse_anterior,
            ref int Pontos)
        {
            LogicaTiroAoAlvo(gameTime, gw, mouse_atual, mouse_anterior, ref Pontos);
        }

        private void LogicaTiroAoAlvo(GameTime gameTime, GameWindow gw,
            MouseState mouse_atual,
            MouseState mouse_anterior,
            ref int Pontos)
        {
            #region Clique, acerto e visibilidade

            if ((mouse_atual.LeftButton == ButtonState.Pressed) &&
                !(mouse_anterior.LeftButton == ButtonState.Pressed)) // clicou ?
            {
                if (destino.Contains(mouse_atual.X, mouse_atual.Y)) // clicou dentro do retangulo de colisão ?
                {
                    if (visivel) // tá aparecendo(ativo) ?
                    {
                        Pontos += pontos;
                        visivel = false;
                        Alvo.qtd_now--;
                        destino = new Rectangle( // sorteia uma nova posição para ele aparecer (com limitação já)
                            random.Next((int)(gw.ClientBounds.Width - tamanho.X)),
                            random.Next(20, (600 - (int)tamanho.Y)),
                            (int)tamanho.X,
                            (int)tamanho.Y);
                        proximoAparecer = tempoAtual + tempoParaAparecer;
                    }
                }
            }
            #endregion

            #region Verifica a visibilidade da carta e o clique

            tempoAtual++;
            if (visivel)
            {
                if (tempoAtual >= proximoAparecer)
                {
                    visivel = false;
                    Alvo.qtd_now--;
                    destino = new Rectangle( // sorteia uma nova posição para ele aparecer, com limitação 
                       random.Next((int)(gw.ClientBounds.Width - tamanho.X)),
                       random.Next(20, (600 - (int)tamanho.Y)),
                        (int)tamanho.X,
                        (int)tamanho.Y);
                    proximoAparecer = tempoAtual + tempoParaAparecer;

                }
            }

            #endregion

            #region Veirifica hora da carta aparecer e a quantidade de cartas na tela
     
            if (!visivel)
            {
                if (tempoAtual >= proximoAparecer)
                {
                    proximoAparecer = tempoAtual + tempoParaAparecer;
                    if (Alvo.qtd_now < Alvo.qtd_max)
                    {
                        destino = new Rectangle(
                            random.Next((int)(gw.ClientBounds.Width - tamanho.X)),
                            random.Next((int)(gw.ClientBounds.Height - tamanho.Y)),
                            (int)tamanho.X,
                            (int)tamanho.Y);

                        bool coincide = false;
                        foreach (Alvo x in Alvo.Lista)
                        {
                            if (x.visivel)
                            {
                                if (x.destino.Intersects(this.destino)) //Colisão entre as cartas
                                {
                                    coincide = true;
                                }
                            }
                        }

                        if (!coincide)
                        {
                            visivel = true;
                            Alvo.qtd_now++;
                        }
                    }
                }
            }

            #endregion
        }

        public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            if (visivel)
                spriteBatch.Draw(textura, destino, origem, Color.White);
        }
    }
}